package com.lemon.support.validator;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;

/**
 * @program: lemonnote
 * @description: 参数校验（非异常抛出,不一定局限于参数校验）
 * @author: Lemontree
 * @create: 2018-05-18 22:46
 **/
public class ArgValidator {

    private ArgValidator() {
    }

    public static boolean argNotBlank(Object object) {
        return !argIsBlank(object);
    }

    /**
     * @Author: Lemontree
     * @Description: 判空
     * @param object
     * @Date: 22:22 2018/7/8
     */
    public static boolean argIsBlank(Object object) {
        if(object instanceof String) {
            return StringUtils.isBlank((CharSequence) object);
        }
        if(object instanceof Collection) {
            return CollectionUtils.isEmpty((Collection) object);
        }
        return null == object;
    }

    /**
     * 存在参数为空（或全为空）
     * @Author: Lemontree
     * @param params
     *            数组列表
     * @Date: 22:21 2018/7/8
     */
    public static boolean anyArgsNull(Object... params) {
        return ifMath(list -> list.stream().anyMatch(Objects::isNull),
                true, params);
    }

    /**
     * @Author: Lemontree
     * @Description: 所有参数为空
     * @param params
     *            参数列表
     * @Date: 21:36 2018/7/8
     */
    public static boolean allArgsEmpty(Object... params) {
        return ifMath(list -> list.stream().allMatch(Objects::isNull),
                true, params);
    }

    /**
     * @Author: Lemontree
     * @Description: 所有参数都不为空
     * @param params
     *            参数列表
     * @Date: 21:36 2018/7/8
     */
    public static boolean allArgsNotEmpty(Object... params) {
        return ifMath(list -> list.stream().allMatch(Objects::isNull),
                false, params);
    }

    /**
     * @Author: Lemontree
     * @Description: 判断字符参数是否存在为空(或全为空)，仅限String使用
     * @param params
     *            参数
     * @Date: 12:15 2018/6/18
     */
    public static boolean anyStrArgsBlank(String... params) {
        return ifMath(list -> list.stream().anyMatch(StringUtils::isBlank),
                true, params);
    }

    /**
     * @Author: Lemontree
     * @Description: 判断字符参数是否全部为空，仅限String使用
     * @param params
     *            参数
     * @Date: 12:15 2018/6/18
     */
    public static boolean allArgsBlank(String... params) {
        return ifMath(list -> list.stream().allMatch(StringUtils::isEmpty),
                true, params);
    }

    /**
     * @description
     * @method ifMath
     * @param predicate
     *            条件 
     * @param choose
     *            判断参数数组是否为空或长度为0
     * @param params
     *            参数数组
     * @return boolean
     * @date: 2018/9/16 19:20
     * @author: Mr.Lemon
     */
    private static <T> boolean ifMath(Predicate<List<T>> predicate,
            boolean choose, T... params) {
        if(arraysIsNull(params)) {
            return choose;
        }
        List<T> list = Arrays.asList(params);
        return predicate.test(list);
    }

    /**
     * @Author: Lemontree
     * @Description: 数组为null ，或者长度为0；
     * @param params
     *            数组
     * @Date: 22:19 2018/7/8
     */
    public static boolean arraysIsNull(Object... params) {
        if(null == params || params.length <= 0) {
            return true;
        }
        return false;
    }

}
